package com.example.j11.demo;

import java.io.*;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;

/**
 * @author zhoudong
 * @version 0.1
 * @date 2018/12/11 12:39
 */
public class J11Demo {

    public static void main(String[] args) throws IOException, InterruptedException {
        // varDemo();
        // listString();
        // files();
        // httpClientDemo();
        optionalDemo();
    }

    public static void varDemo(){
        String text = "hello world";  // Java 8
        var v_text = "hello world";   // Java 11
        System.out.println(text.equals(v_text));

        var v_int = 1;
        v_int = 2;             // 正确
        // v_int = "one";      // 编译无法通过。用var声明的变量仍然是静态类型的。 不兼容的类型无法重新分配给此类变量。
    }

    public static void stringDemo(){
        var text = " hello world ";
        text.isBlank();         // 是否为空，输出false
        text.strip();           // 去除首尾空格，输出“hello world”
        text.stripTrailing();   // 去除尾部空格，输出“ hello world”
        text.stripLeading();    // 去除首部空格，输出“hello world ”
        text.repeat(2);         // 字符串copy，输出“ hello world  hello world ”
        text.lines().count();   // 行数，输出1
        text = " hello \n world ";
        text.lines().count();   // 行数，输出2
    }

    public static void optionalDemo(){
        // Optional 加强
        var optional = Optional.of("hello world");
        String userName = null;
        optional.stream().count();       // 1
        optional.orElseThrow();          // hello world
        Optional.ofNullable(userName).or(() -> Optional.of(" this new. ")).get();   // “ this new. ”
    }

    public static void listAndMap(){
        var list = List.of("hello","world"); // .of() 从给定的参数创建了一个新的不可变列表
        var copyList = List.copyOf(list);    // .copyOf() 创建列表的不可变副本
        System.out.println(list == copyList);// true

        var map = Map.of("key1","value1","key2","value2");
        var copyMap = Map.copyOf(map);

        var set = Set.of(1,2);
        var copySet = Set.copyOf(set);
    }

    public static void listString(){
        var list = List.of(""," hello","\nA\nB","world ");    // 集合新增方法，of()，创建集合；copyOf()，复制集合；注意，这两个方法创建的集合都不可变。
        var copyList = List.copyOf(list);
        System.out.println("两个List是否完全相同：" + (list == copyList));   // true
        copyList.stream()                    // stream() 串行。  parallelStream() 并行。
                .map(String::strip)          // 去除每个字符串前后空格
                .filter(v -> !v.isBlank())   // 过滤掉为空的字符串
                .forEach(v ->{
                    if(v.lines().count() < 2) System.out.println("字符串复制：" + v.repeat(3));   // 如果当前字符串的行数小于2行 字符串复制3次
                });
    }

    public static void transferToDemo() throws IOException {
        var classLoader = ClassLoader.getSystemClassLoader();
        var inputStream = classLoader.getResourceAsStream("source.txt");
        var target = File.createTempFile("target", ".txt",new File("F://temp/"));
        var outputStream = new FileOutputStream(target);
        inputStream.transferTo(outputStream);
    }

    public static void httpClientDemo() throws IOException, InterruptedException {
        // get
        var request = HttpRequest.newBuilder()
                .version(HttpClient.Version.HTTP_2)         // Http版本HTTP_2、HTTP_1_1
                .timeout(Duration.ofMinutes(2))             // 超时时间
                .uri(URI.create("http://httpbin.org/post"))  // 请求URL
                // .GET()                                    // 请求方式，默认GET，POST使用：POST()
                .POST(HttpRequest.BodyPublishers.ofString("hello world."))        // BodyPublishers定义作为请求主体发送的数据类型，如字符串，字节数组，文件或输入流
                .build();
        var client = HttpClient.newBuilder().build();

        // 同步调用
        var response = client.send(request,HttpResponse.BodyHandlers.ofString());
        System.out.println("同步调用返回结果：" + response.body());

        // 异步调用
        client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
                .thenApply(HttpResponse::body)
                .thenAccept(System.out::println)
                .join();
    }
}
